/*
 * En este archivo, definimos las funciones comunes que realizaremos sobre los vectores
 * guardados en el disco
 */

#ifndef _VECTORES_H
#define	_VECTORES_H

    #include <stdio.h>
    #include <sys/time.h>

    #define MAX_CANT_BUFFERS 3
    #define TAM_BUFFER 1024*1024

    /*
     * Buffers
     */
    struct BUFFERS {
        int *datos[MAX_CANT_BUFFERS];
        int enUso[MAX_CANT_BUFFERS];
        __useconds_t ultimoAcceso[MAX_CANT_BUFFERS];
        long long offsetInicio[MAX_CANT_BUFFERS];
        long long tamanio[MAX_CANT_BUFFERS];
        int modificado[MAX_CANT_BUFFERS];
    }; 

    /*
     * Representación de un vector en disco
     */
    struct VECTOR {
        long long dimensionReal;
        long long desplazamientoVirtual;
        long long dimensionVirtual;
        FILE *archivoEnDisco;
        char *nombreArchivo;
        int original;
        struct BUFFERS *buffers;
    };
    
    /*
     * Crea un vector en el disco, con la dimension especificada
     */
    struct VECTOR* crearVector(long long dimension);

    /*
     * Elimina el vector representado en disco
     */
    void eliminarVector(struct VECTOR *vectorEnDisco);

    /*
     * Divide el vector pasado por parametro en 2 vectores.
     * No se duplica ningun archivo en disco, solo se crea una nueva estructura que utiliza como soporte
     * el archivo en disco original.
     */
    struct VECTOR **dividirVectorEnDisco(struct VECTOR *vectorEnDisco);
    
    /*
     * Escribe el 'valor', en el archivo de 'vectorEnDisco', desde la 'posición',
     */
    void escribirValor(struct VECTOR *vectorEnDisco, int valor, long long posicion);
    
    /*
     * Obtiene el valor del 'vectorEnDisco', de la 'posición'
     */
    int obtenerValor(struct VECTOR *vectorEnDisco, long long posicion);
    
    /*
     * Retorna la dimension del vector
     */
    long long obtenerDimension(struct VECTOR *vector);
    
    /*
     * Copia el contenido del vector origen en el vector destino
     */
    void copiarContenidoDeVector(struct VECTOR *origen, struct VECTOR *destino);


#endif	/* _VECTORES_H */
